﻿using System;
using System.Collections.Generic;
using System.Linq;
using StockCrawlerLib.DAL;
using StockCrawlerLib;
using CrawlerCore;
using HtmlAgilityPack;
using System.Text.RegularExpressions;
using System.Globalization;

namespace CrawlerController
{
    public class CafefCrawler : BaseCrawler
    {
        /// <summary>
        /// Tổng hợp lịch sử giao dịch theo link:
        /// //http://s.cafef.vn/Lich-su-giao-dich-L14-1.chn
        /// </summary>
        /// <param name="currCode"></param>
        public override void ImportPriceHisotry(string currCode, DateTime dtStart)
        {
            //http://s.cafef.vn/Lich-su-giao-dich-L14-1.chn
            BrowserSession_General br = new BrowserSession_General();

            string url = string.Format("http://s.cafef.vn/Lich-su-giao-dich-{0}-1.chn", currCode);
            HtmlAgilityPack.HtmlDocument doc = br.Get(url);
            int indexColumn = 0;
            if (br.Response != null)
            {
                string xpath = "//div[@id='ctl00_ContentPlaceHolder1_ctl03_notHO' or @id='ctl00_ContentPlaceHolder1_ctl03_divHO']//table//tr[contains(@id,'ctl00_ContentPlaceHolder1_ctl03_rptData')]";
                HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(xpath);
                //Kiểm tra có dữ liệu không
                if (nodeCollection == null)
                {
                    string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                    SystemConfig.SystemLog.Add(msg);
                    return;
                }

                foreach (HtmlNode node in nodeCollection)
                {
                    HtmlNodeCollection tdCollection = node.SelectNodes(".//td");

                    //Ngày giao dịch
                    indexColumn = 0;
                    string dateString = tdCollection[indexColumn].InnerText.Trim();
                    DateTime ngay_giao_dich;
                    if (!DateTime.TryParseExact(dateString, "dd/MM/yyyy", null,
                        DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal, out ngay_giao_dich))
                    {
                        //Error
                        string msg = string.Format("Error | {0} - ngay_giao_dich", currCode);
                        SystemConfig.SystemLog.Add(msg);
                        continue;
                    }

                    if (ngay_giao_dich.Date < dtStart.Date)
                    {
                        return;
                    }

                    //Khởi tạo object history
                    history objHistory;
                    bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);
                    //if (isExist)
                    //  continue;

                    //Giá đóng cửa
                    indexColumn += 2;
                    float gia_dong_cua;
                    if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_dong_cua))
                    {
                        objHistory.gia_dong_cua = gia_dong_cua;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gia_dong_cua", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Kiểm tra column thứ 3 có phải là column "Giá bình quân" ko?
                    indexColumn++;
                    if (node.SelectNodes("//td[contains(@id,'ctl00_ContentPlaceHolder1_ctl03_rptData_ctl01_avgPriceItem')]") != null)
                    {
                        //Nếu là column giá bình quân thì tăng column lên 1
                        indexColumn++;
                    }

                    //Thay đổi
                    //"0.6 (2.0 %)"                    
                    string change = tdCollection[indexColumn].InnerText.Trim();
                    Regex r = new Regex(@"(?<value1>(\-|).+)\s\((?<value2>.+)\)");
                    Match m = r.Match(change);
                    string value = m.Result("${value1}");
                    string percent = m.Result("${value2}");
                    float thay_doi;
                    if (float.TryParse(value, out thay_doi))
                    {
                        objHistory.thay_doi = thay_doi;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - thay_doi", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Khối lượng khớp lệnh
                    indexColumn += 2;
                    int klgd_khop_lenh = -1;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_khop_lenh))
                    {
                        objHistory.klgd_khop_lenh = klgd_khop_lenh;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - klgd_khop_lenh", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Giá trị khớp lệnh
                    indexColumn++;
                    double gtgd_khop_lenh = -1;
                    if (double.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Float | NumberStyles.AllowThousands, null, out gtgd_khop_lenh))
                    {
                        objHistory.gtgd_khop_lenh = (decimal)gtgd_khop_lenh;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gtgd_khop_lenh", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Khối lượng thỏa thuận
                    indexColumn++;
                    int klgd_thoa_thuan = -1;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out klgd_thoa_thuan))
                    {
                        objHistory.klgd_thoa_thuan = klgd_thoa_thuan;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - klgd_thoa_thuan", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Giá trị thỏa thuận
                    indexColumn++;
                    double gtgd_thoa_thuan = -1;
                    if (double.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Float | NumberStyles.AllowThousands, null, out gtgd_thoa_thuan))
                    {
                        objHistory.gtgd_thoa_thuan = (decimal)gtgd_thoa_thuan;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gtgd_thoa_thuan", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Kiểm tra column thứ 3 có phải là column "Giá tham chiếu" ko?
                    if (node.SelectNodes("//td[contains(@id,'ctl00_ContentPlaceHolder1_ctl03_BasicPriceColHeader')]") != null)
                    {
                        indexColumn++;
                        //Nếu là column giá bình quân thì tăng column lên 1
                        float gia_tham_chieu = -1;
                        if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_tham_chieu))
                        {
                            objHistory.gia_tham_chieu = gia_tham_chieu;
                        }
                        else
                        {
                            //Error
                            string msg = string.Format("Error | {0} - gia_tham_chieu", currCode);
                            SystemConfig.SystemLog.Add(msg);
                        }
                    }

                    //Giá mở cửa
                    indexColumn++;
                    float gia_mo_cua = -1;
                    if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_mo_cua))
                    {
                        objHistory.gia_mo_cua = gia_mo_cua;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gia_mo_cua", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Giá cao nhất
                    indexColumn++;
                    float gia_cao_nhat = -1;
                    if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_cao_nhat))
                    {
                        objHistory.gia_cao_nhat = gia_cao_nhat;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gia_cao_nhat", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Giá thấp nhất
                    indexColumn++;
                    float gia_thap_nhat = -1;
                    if (float.TryParse(tdCollection[indexColumn].InnerText.Trim(), out gia_thap_nhat))
                    {
                        objHistory.gia_thap_nhat = gia_thap_nhat;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gia_thap_nhat", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Cập nhật vào CSDL
                    if (!isExist)
                        _historyRepository.Insert(objHistory);
                    else
                        _historyRepository.Update(objHistory);
                }
            }
        }

        /// <summary>
        /// Tổng hợp lịch sử khớp lệnh theo link 
        /// http://s.cafef.vn/Lich-su-giao-dich-L14-2.chn
        /// </summary>
        /// <param name="currCode"></param>
        public override void ImportOrderHisotry(string currCode, DateTime dtStart)
        {
            //http://s.cafef.vn/Lich-su-giao-dich-L14-2.chn
            BrowserSession_General br = new BrowserSession_General();

            string url = string.Format("http://s.cafef.vn/Lich-su-giao-dich-{0}-2.chn", currCode);
            HtmlAgilityPack.HtmlDocument doc = br.Get(url);
            int indexColumn = 0;
            if (br.Response != null)
            {
                string xpath = "//div[@id='ctl00_ContentPlaceHolder1_ctl03_panelAjax']//table//tr[contains(@id,'ctl00_ContentPlaceHolder1_ctl03_rptData')]";
                HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(xpath);

                //Kiểm tra có dữ liệu không
                if (nodeCollection == null)
                {
                    string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                    SystemConfig.SystemLog.Add(msg);
                    return;
                }

                foreach (HtmlNode node in nodeCollection)
                {
                    HtmlNodeCollection tdCollection = node.SelectNodes(".//td");
                    //Ngày giao dịch
                    indexColumn = 0;
                    string dateString = tdCollection[indexColumn].InnerText.Trim();
                    DateTime ngay_giao_dich;
                    if (!DateTime.TryParseExact(dateString, "dd/MM/yyyy", null,
                        DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AdjustToUniversal, out ngay_giao_dich))
                    {
                        string msg = string.Format("Error | {0} - ngay_giao_dich", currCode);
                        SystemConfig.SystemLog.Add(msg);
                        continue;
                    }

                    if (ngay_giao_dich.Date < dtStart.Date)
                    {
                        return;
                    }

                    //Khởi tọa object
                    history objHistory;
                    bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);
                    //if (isExist)
                    //continue;

                    //Dư mua
                    indexColumn = 1;
                    int du_mua;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out du_mua))
                    {
                        objHistory.du_mua = du_mua;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - du_mua", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Dư bán
                    indexColumn++;
                    int du_ban;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out du_ban))
                    {
                        objHistory.du_ban = du_ban;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - du_ban", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Số lệnh mua
                    indexColumn = 4;
                    int so_lenh_mua;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out so_lenh_mua))
                    {
                        objHistory.so_lenh_mua = so_lenh_mua;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - so_lenh_mua", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Khối lượng đặt mua
                    indexColumn++;
                    int kl_dat_mua;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out kl_dat_mua))
                    {
                        objHistory.kl_dat_mua = kl_dat_mua;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - kl_dat_mua", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Số lệnh bán
                    indexColumn = 7;
                    int so_lenh_ban;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out so_lenh_ban))
                    {
                        objHistory.so_lenh_ban = so_lenh_ban;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - so_lenh_ban", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Khối lượng đặt bán
                    indexColumn++;
                    int kl_dat_ban;
                    if (int.TryParse(tdCollection[indexColumn].InnerText.Trim(), NumberStyles.Integer | NumberStyles.AllowThousands, null, out kl_dat_ban))
                    {
                        objHistory.kl_dat_ban = kl_dat_ban;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - kl_dat_ban", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    //Cập nhật vào CSDL
                    if (!isExist)
                        _historyRepository.Insert(objHistory);
                    else
                        _historyRepository.Update(objHistory);
                }
            }
        }

        public override string GetCurrentInfo(string currCode)
        {

            //http://s.cafef.vn/Lich-su-giao-dich-L14-6.chn
            BrowserSession_General br = new BrowserSession_General();

            string url = string.Format("http://s.cafef.vn/Lich-su-giao-dich-{0}-6.chn", currCode);
            HtmlDocument doc = br.Get(url);
            string content = "";
            if (br.Response != null)
            {
                string xpath = "//*[@id='price-box']";
                HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(xpath);

                //Kiểm tra có dữ liệu không
                if (nodeCollection == null)
                {
                    string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                    SystemConfig.SystemLog.Add(msg);
                    return null;
                }
                foreach (HtmlNode node in nodeCollection)
                {
                    content = node.InnerHtml;
                    content = content.Replace("color:green", "color: #00ff00");
                    content = content.Replace("color:#FF9900", "color: #F7FF31");
                    content = content.Replace("color:red", "color: #FF0000");
                }
            }

            return content;
        }

        /// <summary>
        /// Tổng hợp lịch sử khớp lệnh theo lô trong ngày
        /// http://s.cafef.vn/Lich-su-giao-dich-PVT-6.chn?date=17/06/2015
        /// </summary>
        /// <param name="currCode"></param>
        public void CapNhatGiaThamChieu(string currCode, DateTime ngay_giao_dich)
        {
            //http://s.cafef.vn/Lich-su-giao-dich-L14-2.chn
            BrowserSession_General br = new BrowserSession_General();

            string url = string.Format("http://s.cafef.vn/Lich-su-giao-dich-{0}-6.chn?date={1}", currCode, ngay_giao_dich.ToString("dd/MM/yyyy"));
            HtmlDocument doc = br.Get(url);
            if (br.Response != null)
            {
                string xpath = "//*[@id='price-box']//span[2]";
                HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(xpath);

                //Kiểm tra có dữ liệu không
                if (nodeCollection == null)
                {
                    string msg = string.Format("Error | {0} - Không truy vấn được link {1}", currCode, url);
                    SystemConfig.SystemLog.Add(msg);
                    return;
                }

                foreach (HtmlNode node in nodeCollection)
                {
                    //Khởi tọa object
                    history objHistory;
                    bool isExist = InitHistory(currCode, ngay_giao_dich, out objHistory);
                    if (!isExist)
                        return;

                    float gia_tham_chieu;
                    if (float.TryParse(node.InnerText.Trim(), out gia_tham_chieu))
                    {
                        objHistory.gia_tham_chieu = gia_tham_chieu;
                    }
                    else
                    {
                        //Error
                        string msg = string.Format("Error | {0} - gia_tham_chieu", currCode);
                        SystemConfig.SystemLog.Add(msg);
                    }

                    _historyRepository.Update(objHistory);
                }
            }
        }

    }
}

